package cn.jussi.utils;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;

public class Captcha {
	//验证码的宽
	private int width;
	//验证码的高
	private int height;
	//验证码的位数
	private int num;
	//验证码的字典
	private String code;
	//取随机数的对象
	private static final Random ran = new Random();
	//单例模式
	private static Captcha captcha;
	
	private Captcha() {
		code = "0123456789";
		num = 4;
	}
	//单例模式获取对象的方法
	public static Captcha getInstance() {
		if(captcha==null) captcha = new Captcha();
		return captcha;
	}
	
	public int getWidth() {
		return width;
	}
	public void setWidth(int width) {
		this.width = width;
	}
	
	public int getHeight() {
		return height;
	}
	public void setHeight(int height) {
		this.height = height;
	}
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	
	public String getCode() {
		return code;
	}
	public void setCode(String code) {
		this.code = code;
	}
	
	public void set(int width, int height, int num, String code) {
		this.width = width;
		this.height = height;
		this.setNum(num);
		this.setCode(code);
	}
	
	public void set(int width, int height) {
		this.width = width;
		this.height = height;
	}
	
	/**
	 * 生成验证码的方法
	 * @return
	 */
	public String generateCheckCode() {
		StringBuffer cc = new StringBuffer();
		for(int i=0; i<num; i++) {
			cc.append(code.charAt(ran.nextInt(code.length())));
		}
		return cc.toString();
	}
	
	/**
	 * 画验证码
	 * @param checkcode
	 * @return
	 */
	public BufferedImage generateCheckImg(String checkcode) {
		//创建一个图片对象
		BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		//获取图片对象的画笔
		Graphics2D graphic = img.createGraphics();
		graphic.setColor(Color.white);
		graphic.fillRect(0, 0, width, height);
		graphic.setColor(Color.BLACK);
		graphic.drawRect(0, 0, width-1, height-1);
		Font font = new Font("宋体", Font.BOLD+Font.ITALIC, (int)(height*0.8));
		graphic.setFont(font);
		for(int i=0; i<num; i++) {
			graphic.setColor(new Color(ran.nextInt(155), ran.nextInt(255), ran.nextInt(255)));
			graphic.drawString(String.valueOf(checkcode.charAt(i)), i*(width/num), (int)(height*0.8));
		}
		
		//加一些点
		for(int i=0; i<(width+height); i++) {
			graphic.setColor(new Color(ran.nextInt(255), ran.nextInt(255), ran.nextInt(255)));
			graphic.drawOval(ran.nextInt(width), ran.nextInt(height), 1, 1);
		}
		
		//加一些线
		for(int i=0; i<2; i++) {
			graphic.setColor(new Color(ran.nextInt(155), ran.nextInt(255), ran.nextInt(255)));
			graphic.drawLine(0, ran.nextInt(height), width, ran.nextInt(height));
		}
		
		return img;
	}	
}
